/*====================================================================================================*/
/*====================================================================================================*/
#include "stm32f4_system.h"
#include "stm32f4_usart.h"
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UART_SendByte
**功能 : Send Byte
**輸入 : USARTx, *sendData
**輸出 : None
**使用 : UART_SendByte(USARTx, 'A');
**====================================================================================================*/
/*====================================================================================================*/
void UART_SendByte( USART_TypeDef *USARTx, uint8_t *sendData )
{
  USARTx->DR = (*sendData & (uint16_t)0x01FF);
  while(!(USARTx->SR & USART_FLAG_TC));
}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UART_RecvByte
**功能 : Recv Byte
**輸入 : USARTx, *recvData
**輸出 : None
**使用 : UART_RecvByte(USARTx, recvData);
**====================================================================================================*/
/*====================================================================================================*/
void UART_RecvByte( USART_TypeDef *USARTx, uint8_t *recvData )
{
  while(!(USARTx->SR & USART_FLAG_RXNE));
  *recvData = (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UART_RecvByteWTO
**功能 : Recv Byte with Timeout
**輸入 : USARTx, *recvData, timeoutMs
**輸出 : State
**使用 : UART_RecvByteWTO(USARTx, recvData, 200);
**====================================================================================================*/
/*====================================================================================================*/
int8_t UART_RecvByteWTO( USART_TypeDef *USARTx, uint8_t *recvData, uint32_t timeoutMs )
{
  while((USARTx->SR & USART_FLAG_RXNE) == RESET) {
    if(timeoutMs-- > 0)
      delay_ms(1);
    else
      return ERROR; // timeout
  }
  *recvData = (uint16_t)(USARTx->DR & (uint16_t)0x01FF);

  return SUCCESS;
}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UART_SendData
**功能 : Send Data
**輸入 : USARTx, *sendData, lens
**輸出 : None
**使用 : UART_SendData(USARTx, sendData, lens);
**====================================================================================================*/
/*====================================================================================================*/
void UART_SendData( USART_TypeDef *USARTx, uint8_t *sendData, uint16_t lens )
{
  do {
    UART_SendByte(USARTx, sendData++);
  } while(--lens);
}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UART_RecvData
**功能 : Recv Data
**輸入 : USARTx, *recvData, lens
**輸出 : None
**使用 : UART_RecvData(USARTx, recvData, lens);
**====================================================================================================*/
/*====================================================================================================*/
void UART_RecvData( USART_TypeDef *USARTx, uint8_t *recvData, uint16_t lens )
{
  do {
    UART_RecvByte(USARTx, recvData++);
  } while(--lens);
}
/*====================================================================================================*/
/*====================================================================================================*
**函數 : UART_RecvDataWTO
**功能 : Recv Data With Timeout
**輸入 : USARTx, *recvData, lens, timeoutMs
**輸出 : state
**使用 : UART_RecvDataWTO(USARTx, recvData, lens, 200);
**====================================================================================================*/
/*====================================================================================================*/
int8_t UART_RecvDataWTO( USART_TypeDef *USARTx, uint8_t *recvData, uint16_t lens, uint32_t timeoutMs )
{
  int8_t state = ERROR;

  do {
    state = UART_RecvByteWTO(USARTx, recvData++, timeoutMs);
  } while((--lens) && (state != ERROR));

  return state;
}
/*====================================================================================================*/
/*====================================================================================================*/
